%filenames parser
%scanner <scanner.h>

%token VINT
%token INICIO_BLOQUE
%token FIN_BLOQUE
%token DOSPUNTOS
%token IP_ADDR
%token ID

%token NETTHUMB_HOST	
%token NETTHUMB_DEV		
%token NETTHUMB_LINK	
%token NETTHUMB_UP		
%token NETTHUMB_DOWN	
%token NETTHUMB_ADDR	
%token NETTHUMB_NETWORK	
%token NETTHUMB_SCOPE	
%token NETTHUMB_GLOBAL	
%token NETTHUMB_SITE	
%token NETTHUMB_ROUTE	
%token NETTHUMB_NET		
%token NETTHUMB_DEFAULT	
%token NETTHUMB_VIA		
%token NETTHUMB_METRIC	
%token NETTHUMB_PRIORITY	
%token NETTHUMB_UNICAST	
%token NETTHUMB_UNREACHABLE	
%token NETTHUMB_BLACKHOLE	
%token NETTHUMB_PROHIBIT	
%token NETTHUMB_LOCAL	
%token NETTHUMB_BROADCAST	
%token NETTHUMB_THROW	
%token NETTHUMB_NAT		
%token NETTHUMB_ANYCAST	
%token NETTHUMB_MULTICAST	
%token NETTHUMB_ROUTER	
%token NETTHUMB_TYPE	
%token NETTHUMB_MTU		
%token NETTHUMB_ON		
%token NETTHUMB_OFF         

%start program

%%
program: 
     hosts routers networks
|
     hosts networks
     {
       std::cout << "Reconocido patron \'hosts-networks\'" << std::endl;
     }
;

hosts:
     hosts host
|
     host
;

host:
     NETTHUMB_HOST ID INICIO_BLOQUE devices route FIN_BLOQUE
|
     NETTHUMB_HOST error
     {
         std::cout << "Error: Se esperaba Identificador" << std::endl;
     }
|
     NETTHUMB_HOST ID error
     {
         std::cout << "Error: Se esperaba \'{\'" << std::endl;
     }
|
     NETTHUMB_HOST ID INICIO_BLOQUE devices route error
     {
         std::cout << "Error: Se esperaba \'}\'" << std::endl;
     }
|
     error
     {
         std::cout << "Error: Se esperaba \'host\'" << std::endl;
     }
;

devices: 
     NETTHUMB_DEV ID INICIO_BLOQUE linkDescriptions netConf blockDevicesEnd
|
     devices NETTHUMB_DEV ID INICIO_BLOQUE linkDescriptions netConf blockDevicesEnd
|
     devices NETTHUMB_DEV error
     {
         std::cout << "Error: se esperaba nombre del dispositivo" << std::endl;
     }

|
     devices NETTHUMB_DEV ID error
     {
         std::cout << "Error: se esperaba \'{\'" << std::endl;
     }
|
     NETTHUMB_DEV error
     {
         std::cout << "Error: se esperaba nombre del dispositivo" << std::endl;
     }
|
     NETTHUMB_DEV ID error
     {
         std::cout << "Error: se esperaba \'{\'" << std::endl;
     }
|
     error
     {
         std::cout << "Error: se esperaba palabra reservada \'dev\'" << std::endl;
     }
;

blockDevicesEnd:
     FIN_BLOQUE
|
     error
     {
         std::cout << "Error: se esperaba \'}\'" << std::endl;
     }
;
     
linkDescriptions:
     linkDescriptions linkAddr linkStates
|
     linkAddr linkStates
;

linkAddr:
     NETTHUMB_LINK DOSPUNTOS ID
|
     NETTHUMB_LINK error
     {
         std::cout << "Error: se esperaban dos puntos (\':\')" << std::endl;
     }
|
     NETTHUMB_LINK DOSPUNTOS error
     {
         std::cout << "Error: se esperaba identificador" << std::endl;
     }
;

linkStates:
     NETTHUMB_UP
|
     NETTHUMB_DOWN
|
     error 
     {
         std::cout << "Error: Se esperaba estado de la conexion: \'up\' o \'down\'" << std::endl;
     }
;

netConf:
     NETTHUMB_ADDR IP_ADDR NETTHUMB_NETWORK ID scope
|
     NETTHUMB_ADDR error
     {
         std::cout << "Error: se esperaba direccion IP" << std::endl;
     }
|
     NETTHUMB_ADDR IP_ADDR error
     {
         std::cout << "Error: se esperaba palabra reservada \'net\'" << std::endl;
     }
|
     NETTHUMB_ADDR IP_ADDR NETTHUMB_NETWORK error
     {
         std::cout << "Error: se esperaba identificador para la red" << std::endl;
     }
;

scope:
     scope NETTHUMB_SCOPE scopeOpt
|
     NETTHUMB_SCOPE scopeOpt
;

scopeOpt:
     NETTHUMB_GLOBAL
|
     NETTHUMB_SITE
|
     NETTHUMB_LINK
|
     NETTHUMB_HOST
|
     error
     {
         std::cout << "Error: se esperaba \'global\' o \'site\' o \'link\' o \'host\'" << std::endl;
     }
;

route:
     NETTHUMB_ROUTE INICIO_BLOQUE routeOptionsGroups routeDefOpt FIN_BLOQUE
|
     NETTHUMB_ROUTE INICIO_BLOQUE routeOptionsGroups routeDefOpt error
     {
        std::cout << "Error: se esperaba fin de bloque \'}\'" << std::endl;
     }
|
     NETTHUMB_ROUTE error
     {
        std::cout << "Error: se esperaba inicio de bloque \'{\'" << std::endl;
     }
;

routeOptionsGroups:
     routeOptionsGroups typeR net options
|
     typeR net options
|
     error
     {
        std::cout << "Se esperaba tipo de red: \'unicast\', \'unreachable\', \'blackhole\', \'prohibit\', \'local\', \'broadcast\'";
        std::cout << " \'throw\', \'nat\', \'anycast\', \'multicast\' o tipo vacio" << std::endl;
     }
;

typeR:
     NETTHUMB_UNICAST
|
     NETTHUMB_UNREACHABLE
|
     NETTHUMB_BLACKHOLE
|
     NETTHUMB_PROHIBIT
|
     NETTHUMB_LOCAL
|
     NETTHUMB_BROADCAST
|
     NETTHUMB_THROW
|
     NETTHUMB_NAT
|
     NETTHUMB_ANYCAST
|
     NETTHUMB_MULTICAST
|
;

net:
     NETTHUMB_NET ID conf_r
|
     NETTHUMB_NET error
     {
         std::cout << "Error, se esperaba identificador de red" << std::endl;
     }
;

conf_r:
     NETTHUMB_VIA IP_ADDR NETTHUMB_DEV ID
|
     NETTHUMB_VIA error
     {
         std::cout << "Error: se esperaba direccion IP" << std::endl;
     }
|
     NETTHUMB_VIA IP_ADDR NETTHUMB_DEV error
     {
         std::cout << "Error: se esperaba identificador de dispositivo" << std::endl;
     }
|
     NETTHUMB_DEV ID
|
     NETTHUMB_DEV error
     {
         std::cout << "Error: se esperaba identificador de dispositivo" << std::endl;
     }
;

options:
     metricPriority VINT
|
     metricPriority error
     {
         std::cout << "Error: se esperaba valor entero" << std::endl;
     }
|
;

metricPriority:
     NETTHUMB_METRIC
|
     NETTHUMB_PRIORITY
;

routeDefOpt:
     NETTHUMB_DEFAULT conf_r metricPriority VINT
|
     NETTHUMB_DEFAULT conf_r metricPriority error
     {
         std::cout << "Error: se esperaba valor entero" << std::endl;
     }
|
;

routers:
    routers router
|
    router
;

router:
    NETTHUMB_ROUTER ID INICIO_BLOQUE devices FIN_BLOQUE
|
    NETTHUMB_ROUTER error
    {
        std::cout << "Error: se esperaba identificador para el router" << std::endl;
    }
|
    NETTHUMB_ROUTER ID error
    {
        std::cout << "Error: se esperaba inicio de bloque \'{\'" << std::endl;
    }
|
    NETTHUMB_ROUTER ID INICIO_BLOQUE devices error
    {
        std::cout << "Error: se esperaba fin de bloque \'{\' o especificacion de ruta" << std::endl;
    }
|
    NETTHUMB_ROUTER ID INICIO_BLOQUE devices route FIN_BLOQUE
|
    NETTHUMB_ROUTER ID INICIO_BLOQUE devices route error
    {
        std::cout << "Error: se esperaba fin de bloque \'{\'" << std::endl;
    }
;

networks:
    networks network
|
    network
;

network:
    NETTHUMB_NETWORK ID INICIO_BLOQUE netType netLink NETTHUMB_ADDR IP_ADDR FIN_BLOQUE
|
    NETTHUMB_NETWORK error
    {
        std::cout << "Error: se esperaba identificador para la red" << std::endl;
    }
|
    NETTHUMB_NETWORK ID error
    {
        std::cout << "Error: se esperaba inicio de bloque \'{\'" << std::endl;
    }
|
    NETTHUMB_NETWORK ID INICIO_BLOQUE netType netLink error
    {
        std::cout << "Error: se esperaba palabra reservada \'addr\'" << std::endl;
    }
|
    NETTHUMB_NETWORK ID INICIO_BLOQUE netType netLink NETTHUMB_ADDR error
    {
        std::cout << "Error: se esperaba direccion IP" << std::endl;
    }
|
    NETTHUMB_NETWORK ID INICIO_BLOQUE netType netLink NETTHUMB_ADDR IP_ADDR error
    {
        std::cout << "Error: se esperaba fin de bloque \'}\'" << std::endl;
    }
;

netType:
    NETTHUMB_TYPE ID
|
    NETTHUMB_TYPE error
    {
        std::cout << "Error: se esperaba identificador para el tipo de red" << std::cout;
    }
;

netLink:
    NETTHUMB_LINK NETTHUMB_MTU VINT NETTHUMB_MULTICAST onOff
|
    NETTHUMB_LINK NETTHUMB_MTU error
    {
        std::cout << "Error: se esperaba entero para valor de MTU" << std::endl;
    }
|
    NETTHUMB_LINK NETTHUMB_MTU VINT NETTHUMB_MULTICAST error
    {
        std::cout << "Error: se esperaba \'on\' u \'off\' como valores validos para Multicast" << std::endl;
    }
;

onOff:
    NETTHUMB_ON
|
    NETTHUMB_OFF
;
